package com.example.test.vipplatereceive;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.example.test.utils.DateUtils;
import com.example.test.utils.FileUtils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Date 25/8/2023 下午1:37
 * 生成订购关系txt文件工具类
 */

public class OrderReceiveFTPUtil {

    public static void main(String[] args) {

        // 产品编码
        String productCode = "9012";
        // 产品名称
        String productName = "组合产品32元";
        // 办理渠道 = 订购渠道/退订渠道
        String orderChannel = "channel";
        // 省份编码
        String province = "74";
        // 是否为首月订购
        String isFirstOrder = "";
        // 一级渠道
        String oneLevel = "oneLevelChannel";
        // 二级渠道
        String twoLevel = "twoLevelChannel";
        // 三级渠道
        String threeLevel = "threeLevelChannel";
        // 同步渠道ID
        String channelId = "b331e900e8a94b60a28769594ef5b185";
        // 同步渠道名称
        String channelName = "流量中台";
        // 文件保存位置
        String targetPath = "G:\\kc_data\\Test";

        // 生成数据条数
        int num = 10;
        //  订购 、退订相差月份 >=0
        int month = 0;
        getOrderTxt(num,month,targetPath,productCode,productName,orderChannel,province,isFirstOrder,oneLevel,twoLevel,threeLevel,channelId,channelName);

    }



    public static void getOrderTxt(int num, int month, String targetPath, String productCode, String productName, String orderChannel, String province, String isFirstOrder, String oneLevel, String twoLevel, String threeLevel, String channelId,String channelName){

        // 将数据保存到txt文件中
        String orderPath = targetPath+"\\"+DateUtils.format(new Date(), DatePattern.PURE_DATE_PATTERN)+"_order.txt";
        String cancelPath = targetPath+"\\"+DateUtils.format(new Date(), DatePattern.PURE_DATE_PATTERN)+"_cancel.txt";
        Map<Integer, List<String>> data = getData(num, month,productCode,productName,orderChannel,province,isFirstOrder,oneLevel,twoLevel,threeLevel,channelId,channelName);
        Set<Map.Entry<Integer, List<String>>> entries = data.entrySet();
        for (Map.Entry<Integer, List<String>> entry : entries) {
            Integer key = entry.getKey();
            List<String> value = entry.getValue();
            System.out.println("key:" + key);
            System.out.println("value:" + JSON.toJSONString(value));
            if(key==0){
                // 将数据保存到txt文件中
                saveResult2Txt(value,orderPath);
            }else if(key ==1){
                saveResult2Txt(value,cancelPath);
            }

        }

    }

    /**
     * 生成数据
     * @param num  :数据量
     * @param month ：订购退订时间相差月份
     */
    public static Map<Integer,List<String>> getData(int num , int month,String productCode, String productName, String orderChannel, String province, String isFirstOrder, String oneLevel, String twoLevel, String threeLevel, String channelId,String channelName){
        Map<Integer,List<String>>result ;

        // 订购时间 取当前时间
        String orderTime = format(new Date(), DatePattern.NORM_DATETIME_PATTERN);

        // 退订时间
        String  cancelOrderTime = getEndOfMonthMM(orderTime,DatePattern.NORM_DATETIME_PATTERN,month);
        // 数据生成
        result = getResultData(num,orderTime,cancelOrderTime,productCode,productName,orderChannel,province,isFirstOrder,oneLevel,twoLevel,threeLevel,channelId,channelName);
        return result;
    }


    /**
     * 成成数据
     * @param num  数据条数
     * @param orderTime ：订购时间
     * @param cancelOrderTime ：退订时间
     */
    private static Map<Integer,List<String>> getResultData(int num, String orderTime, String cancelOrderTime,String productCode, String productName, String orderChannel, String province, String isFirstOrder, String oneLevel, String twoLevel, String threeLevel, String channelId,String channelName) {
        Map<Integer,List<String>>result = new HashMap<>();
        List<String> order = new ArrayList<>(num);
        List<String> cancelOrder = new ArrayList<>(num);
        StringBuilder orderSb = new StringBuilder(String.valueOf(num));
        StringBuilder cancelOrderSb = new StringBuilder(String.valueOf(num));
        // 订单id  自动生成
        String orderId = "";


        // 生成手机号码 自动生成
        String phone = getPhone(8);

        // 领取账号 自动生成
        String account = "";

        // 领取账号类型 默认手机号
        String accountType = "4";

        // 订购时间 orderTime

        // 生效时间
        String effectTime = "";



        //退订时间 cancelOrderTime

        // 失效时间
        String loseEffectTime = "";

        // 订购状态
        String  orderState = "0";

        String cancelOrderState = "1";




        for (int i = 0; i < num; i++) {
            // 订单id
            orderId = getOrder();


            // 生成手机号码
           phone = getPhone(8);

            // 订购时间 orderTime
            // 生效时间
            effectTime = orderTime;


            // 订购状态
            orderState = "0";

            cancelOrderState = "1";

            // 订购数据
            orderSb.append("\r\n")
                    .append(orderId).append("|")
                    .append(productCode).append("|")
                    .append(productName).append("|")
                    .append(phone).append("|")
                    .append(account).append("|")
                    .append(accountType).append("|")
                    .append(orderTime).append("|")
                    .append(effectTime).append("|")
                    .append(orderChannel).append("|")
                    .append(" ").append("|") // 订购时，退订时间为空
                    .append(" ").append("|")
                    .append(orderState).append("|")
                    .append(province).append("|")
                    .append(isFirstOrder).append("|")
                    .append(oneLevel).append("|")
                    .append(twoLevel).append("|")
                    .append(threeLevel).append("|")
                    .append(channelId).append("|")
                    .append(channelName);
            order.add(orderSb.toString());
            orderSb.delete(0,orderSb.length());

            // 退订数据

            // 退订时间 cancelOrderTime

            // 失效时间
            loseEffectTime = cancelOrderTime;

            // 办理渠道 = 订购渠道/退订渠道
            String  cancelOrderChannel = orderChannel;

            cancelOrderSb.append("\r\n")
                    .append(orderId).append("|")
                    .append(productCode).append("|")
                    .append(productName).append("|")
                    .append(phone).append("|")
                    .append(account).append("|")
                    .append(accountType).append("|")
                    .append(orderTime).append("|")
                    .append(effectTime).append("|")
                    .append(cancelOrderChannel).append("|")
                    .append(cancelOrderTime).append("|")
                    .append(loseEffectTime).append("|")
                    .append(cancelOrderState).append("|")
                    .append(province).append("|")
                    .append(isFirstOrder).append("|")
                    .append(oneLevel).append("|")
                    .append(twoLevel).append("|")
                    .append(threeLevel).append("|")
                    .append(channelId).append("|")
                    .append(channelName);
            cancelOrder.add(cancelOrderSb.toString());
            cancelOrderSb.delete(0,cancelOrderSb.length());


        }
        // 保存到结果集
        result.put(0,order);
        result.put(1,cancelOrder);
        return result;

    }


    public static String getOrder(){
        return format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN) +getRandom(6);
    }




    /**
     * 获取手机号码
     * @param length
     * @return
     */
    public static String getPhone(int length){
//        List bg = new ArrayList();
        Random random = new Random();
        String [] bg = {"151","188","155","133"};

        String val = bg[random.nextInt(bg.length - 1)]; //开头
        val += getRandom(length);
        return val;
    }


    public static String getRandom(int length){

        Random random = new Random();
        String val = "";
        for (int i = 0; i < length; i++) {
            val += String.valueOf(random.nextInt(10));
        }
        return val;
    }



    /**
     * 保存数据到指定Txt文件
     * @param list ：字符串集合
     * @param savePath ：保存的文件地址
     */
    public static void saveResult2Txt(List<String> list, String savePath){

        // 判断文件是否存在，不存在则创建
        File file = new File(savePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        // 保存数据
        try {
            if(list.size()>0){
                System.out.println("savaList中的数据为：" + JSON.toJSONString(list.size()));
                try {
                    BufferedWriter writer = new BufferedWriter(new FileWriter(savePath, true));

                    for (String ssmsResullt : list) {

                        writer.write(ssmsResullt);
                    }

                    writer.flush();//清空缓冲区数据
                    writer.close();//关闭读写流

                } catch (IOException e) {
                    e.printStackTrace();
                }

                list.clear();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     *  Date 日期格式化
     * @param date
     * @param pattern
     * @return
     */
    public static String format(Date date, String pattern) {
        DateFormat format = null;
        try {
            format = new SimpleDateFormat(pattern);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            format = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
        }

        return format.format(date);
    }

    /**
     * 增加时间天数
     * eg: 2023-06-02 15:25:25  + 7 天     =》2023-06-09 15:25:25

     * @param time:原时间
     * @param format:原时间格式
     * @param days:要增加的天数
     * @throws ParseException
     */
    public static String  addTimeWithDay(String time,String format,int days) {
        DateTime dateTime = DateUtil.parse(time, format);
        //+1是加一天，-1是减一天，
        //日期加一天
        DateTime offDate = DateUtil.offsetDay(dateTime, +days);

        return DateUtil.format(offDate, format);
    }


    /**
     * 按月份增加时间
     * eg: 2023-06-02 15:25:25  + 7 天     =》2023-06-09 15:25:25

     * @param time:原时间
     * @param format:原时间格式
     * @param months:要增加的月份数
     * @throws ParseException
     */
    public static String  addTimeWithMonth(String time,String format,int months) {
        DateTime dateTime = DateUtil.parse(time, format);
        //+1是加一天，-1是减一天，
        //日期加一天
        DateTime offDate = DateUtil.offsetMonth(dateTime, +months);
        return DateUtil.format(offDate, format);
    }

    /**
     * 月份累加。
     *
     * @return
     * @throws ParseException
     */
    public static String getMonthAdd(String date, int month) {
        SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        Date parse = null;
        try {
            parse = dft.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.setTime(parse);
        calendar.add(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        return dft.format(calendar.getTime());
    }

    /**
     * 获取传入月份最后一天最后一秒
     * @param
     * @throws ParseException
     */

    public static String  getEndOfMonth(String date,String format){
        DateTime dateTime = DateUtil.endOfMonth(DateUtil.parse(date, format));
        return DateUtil.format(dateTime,format);
    }

    /**
     * 计算自然月累加，并获取月份最后一天最后一秒
     * @param date  日期
     * @param format 传入日期的格式
     * @param month  要添加的月份
     * @return  月份最后一天最后一秒
     */
    public static String getEndOfMonthMM(String date,String format ,int month){
        String targetFormat = DatePattern.NORM_DATE_PATTERN;
        String s = timeParse(date, format, targetFormat);
        String monthAdd = getMonthAdd(s, month);// 时间累加
        return getEndOfMonth(monthAdd, DatePattern.NORM_DATE_PATTERN)+" 23:59:59";
    }

    /**
     * 获取传入月份第一天第一秒
     * @param
     * @throws ParseException
     */

//    public static Date  getbeginOfMonth(Date month){
    public static String  getbeginOfMonth(String date,String format){
        DateTime dateTime = DateUtil.beginOfMonth(DateUtil.parse(date, format));
        return DateUtil.format(dateTime,format);
    }

    /**
     * 时间格式转换
     * @param time  当前时间
     * @param format :当前时间格式
     * @param targetFormat     ：目标时间格式
     * @return
     */
    public static String timeParse(String time,String format,String targetFormat){
        Date date2 = DateUtil.parse(time,format);
        return  DateUtil.format(date2, targetFormat);
    }


}
